﻿
using System;
using System.Collections;
using System.IO;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.СправочникиСсылка;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.СправочникиСсылка
{
	///<summary>
	///(Регл)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class СпособыОтраженияЗарплатыВРеглУчете:СправочникСсылка,IСериализаторProtoBuf,IСериализаторJson
	{
		public static readonly Guid ГуидКласса = new Guid("96d81af6-9a15-4c01-98e9-f1f64ad5031b");
		public static readonly DateTime ВерсияКласса = DateTime.ParseExact("20120928011955.000", new string[] {"yyyyMMddHHmmss.fff"}, CultureInfo.InvariantCulture, DateTimeStyles.None);
		public static readonly long КонтрольнаяСуммаКласса = 123;
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		public bool ПометкаУдаления {get;set;}
		public bool Предопределенный {get;set;}
		public V82.СправочникиСсылка.СпособыОтраженияЗарплатыВРеглУчете Родитель {get;set;}
		public bool ЭтоГруппа {get;set;}
		[DataMember(Name = "Представление")]//Проверить основное представление.
		[ProtoMember(3)]
		public string/*100*/ Наименование {get;set;}
		public object СчетДт {get;set;}//Счет Дт
		public object СубконтоДт1 {get;set;}//Субконто Дт номер 1
		public object СубконтоДт2 {get;set;}//Субконто Дт номер 2
		public object СубконтоДт3 {get;set;}//Субконто Дт номер 3
		public V82.СправочникиСсылка.СпособыРаспределенияЗатратНаВыпуск СпособРаспределенияЗатрат {get;set;}//Способ распределения затрат
		public object СчетКт {get;set;}//Счет Кт
		public object СубконтоКт1 {get;set;}//Субконто Кт номер 1
		public object СубконтоКт2 {get;set;}//Субконто Кт номер 2
		public object СубконтоКт3 {get;set;}//Субконто Кт номер 3
		public object СчетДтНУ {get;set;}//Счет дебета налогового учета
		public object СубконтоДтНУ1 {get;set;}//Субконто Дт нал. учета номер 1
		public object СубконтоДтНУ2 {get;set;}//Субконто Дт нал. учета номер 2
		public object СубконтоДтНУ3 {get;set;}//Субконто Дт нал. учета номер 3
		public object СчетКтНУ {get;set;}//Счет кредита налогового учета
		public object СубконтоКтНУ1 {get;set;}//Субконто Кт нал. учета номер 1
		public object СубконтоКтНУ2 {get;set;}//Субконто Кт нал. учета номер 2
		public object СубконтоКтНУ3 {get;set;}//Субконто Кт нал. учета номер 3
		public V82.Перечисления/*Ссылка*/.ОтражениеВУСН ОтражениеВУСН {get;set;}//Отражение ВУСН
		public V82.СправочникиСсылка.ПодразделенияОрганизаций ПодразделениеДт {get;set;}//Подразделение Дт
		public V82.СправочникиСсылка.ПодразделенияОрганизаций ПодразделениеКт {get;set;}//Подразделение Кт
		public V82.Перечисления/*Ссылка*/.ВидыНачисленийОплатыТрудаПоСт255НК ВидНачисленийОплатыТрудаПоСтатье255НК {get;set;}//Вид начислений оплаты труда по статье255 НК
		
		public СпособыОтраженияЗарплатыВРеглУчете()
		{
		}
		
		public СпособыОтраженияЗарплатыВРеглУчете(byte[] УникальныйИдентификатор)
			: this(УникальныйИдентификатор,0)
		{
		}
		
		public СпособыОтраженияЗарплатыВРеглУчете(byte[] УникальныйИдентификатор,int Глубина)
		{
			if (Глубина>3)
			{
				return;
			}
			if (new Guid(УникальныйИдентификатор) == Guid.Empty)
			{
				return;
			}
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Select top 1 
					_IDRRef [Ссылка]
					,_Version [Версия]
					,_Marked [ПометкаУдаления]
					,_IsMetadata [Предопределенный]
					,_ParentIDRRef [Родитель]
					,_Folder [ЭтоГруппа]
					,_Description [Наименование]
					,_Fld1876RRef [СчетДт]
					,_Fld1877RRef [СубконтоДт1]
					,_Fld1878RRef [СубконтоДт2]
					,_Fld1879RRef [СубконтоДт3]
					,_Fld1880RRef [СпособРаспределенияЗатрат]
					,_Fld1881RRef [СчетКт]
					,_Fld1882RRef [СубконтоКт1]
					,_Fld1883RRef [СубконтоКт2]
					,_Fld1884RRef [СубконтоКт3]
					,_Fld1885RRef [СчетДтНУ]
					,_Fld1886RRef [СубконтоДтНУ1]
					,_Fld1887RRef [СубконтоДтНУ2]
					,_Fld1888RRef [СубконтоДтНУ3]
					,_Fld1889RRef [СчетКтНУ]
					,_Fld1890RRef [СубконтоКтНУ1]
					,_Fld1891RRef [СубконтоКтНУ2]
					,_Fld1892RRef [СубконтоКтНУ3]
					,_Fld1893RRef [ОтражениеВУСН]
					,_Fld26611RRef [ПодразделениеДт]
					,_Fld26612RRef [ПодразделениеКт]
					,_Fld26613RRef [ВидНачисленийОплатыТрудаПоСтатье255НК]
					From _Reference155(NOLOCK)
					Where _IDRRef=@УникальныйИдентификатор  -- and _Folder = 0x01  ";
					Команда.Parameters.AddWithValue("УникальныйИдентификатор", УникальныйИдентификатор);
					using (var Читалка = Команда.ExecuteReader())
					{
						if (Читалка.Read())
						{
							//ToDo: Читать нужно через GetValues()
							Ссылка = new Guid((byte[])Читалка.GetValue(0));
							var ПотокВерсии = ((byte[])Читалка.GetValue(1));
							Array.Reverse(ПотокВерсии);
							Версия =  BitConverter.ToInt64(ПотокВерсии, 0);
							ВерсияДанных =  Convert.ToBase64String(ПотокВерсии);
							ПометкаУдаления = ((byte[])Читалка.GetValue(2))[0]==1;
							Предопределенный = ((byte[])Читалка.GetValue(3))[0]==1;
							Родитель = new V82.СправочникиСсылка.СпособыОтраженияЗарплатыВРеглУчете((byte[])Читалка.GetValue(4),Глубина+1);
							ЭтоГруппа = ((byte[])Читалка.GetValue(5))[0]==0;
							Наименование = Читалка.GetString(6);
							if(!ЭтоГруппа)
							{
								СпособРаспределенияЗатрат = new V82.СправочникиСсылка.СпособыРаспределенияЗатратНаВыпуск((byte[])Читалка.GetValue(11),Глубина+1);
								ОтражениеВУСН = V82.Перечисления/*Ссылка*/.ОтражениеВУСН.ПустаяСсылка.Получить((byte[])Читалка.GetValue(24));
								ПодразделениеДт = new V82.СправочникиСсылка.ПодразделенияОрганизаций((byte[])Читалка.GetValue(25),Глубина+1);
								ПодразделениеКт = new V82.СправочникиСсылка.ПодразделенияОрганизаций((byte[])Читалка.GetValue(26),Глубина+1);
								ВидНачисленийОплатыТрудаПоСтатье255НК = V82.Перечисления/*Ссылка*/.ВидыНачисленийОплатыТрудаПоСт255НК.ПустаяСсылка.Получить((byte[])Читалка.GetValue(27));
							}
							//return Ссылка;
						}
						else
						{
							//return null;
						}
					}
				}
			}
		}
		
		public V82.СправочникиОбъект.СпособыОтраженияЗарплатыВРеглУчете  ПолучитьОбъект()
		{
			var Объект = new V82.СправочникиОбъект.СпособыОтраженияЗарплатыВРеглУчете();
			Объект._ЭтоНовый = false;
			Объект.Ссылка = Ссылка;
			Объект.Версия = Версия;
			Объект.ПометкаУдаления = ПометкаУдаления;
			Объект.Предопределенный = Предопределенный;
			Объект.Родитель = Родитель;
			Объект.ЭтоГруппа = ЭтоГруппа;
			Объект.Наименование = Наименование;
			Объект.СчетДт = СчетДт;
			Объект.СубконтоДт1 = СубконтоДт1;
			Объект.СубконтоДт2 = СубконтоДт2;
			Объект.СубконтоДт3 = СубконтоДт3;
			Объект.СпособРаспределенияЗатрат = СпособРаспределенияЗатрат;
			Объект.СчетКт = СчетКт;
			Объект.СубконтоКт1 = СубконтоКт1;
			Объект.СубконтоКт2 = СубконтоКт2;
			Объект.СубконтоКт3 = СубконтоКт3;
			Объект.СчетДтНУ = СчетДтНУ;
			Объект.СубконтоДтНУ1 = СубконтоДтНУ1;
			Объект.СубконтоДтНУ2 = СубконтоДтНУ2;
			Объект.СубконтоДтНУ3 = СубконтоДтНУ3;
			Объект.СчетКтНУ = СчетКтНУ;
			Объект.СубконтоКтНУ1 = СубконтоКтНУ1;
			Объект.СубконтоКтНУ2 = СубконтоКтНУ2;
			Объект.СубконтоКтНУ3 = СубконтоКтНУ3;
			Объект.ОтражениеВУСН = ОтражениеВУСН;
			Объект.ПодразделениеДт = ПодразделениеДт;
			Объект.ПодразделениеКт = ПодразделениеКт;
			Объект.ВидНачисленийОплатыТрудаПоСтатье255НК = ВидНачисленийОплатыТрудаПоСтатье255НК;
			return Объект;
		}
		
		private static readonly Hashtable Кэш = new Hashtable(1000);
		
		public static V82.СправочникиСсылка.СпособыОтраженияЗарплатыВРеглУчете ВзятьИзКэша(byte[] УникальныйИдентификатор)
		{
			var УИ = new Guid(УникальныйИдентификатор);
			if (Кэш.ContainsKey(УИ))
			{
				return (V82.СправочникиСсылка.СпособыОтраженияЗарплатыВРеглУчете)Кэш[УИ];
			}
			var Ссылка = new V82.СправочникиСсылка.СпособыОтраженияЗарплатыВРеглУчете(УникальныйИдентификатор);
			Кэш.Add(УИ, Ссылка);
			return Ссылка;
		}
		
		public void СериализацияProtoBuf(Stream Поток)
		{
			Serializer.Serialize(Поток,this);
		}
		
		public string СериализацияJson()
		{
			return this.ToJson();
		}
		
		public string СериализацияXml()
		{
			return this.ToXml();
		}
	}
}